Interview - Developmental Milestone Project

How to Measure Parents’ Developmental Foci: Domains and Methodologies

Chi Zhang

the University of Manchester

Saturday, the 31th of January, 2026

About me

  • PhD in Education, The University of Manchester (2021–Present);
    From belief to practice: Understanding teachers’ pedagogic choices in China’s mathematics education

  • MSc in Research Methods with Education (Distinction, 2020–2021);
    The association between mathematics teachers’ exclusivity belief and pedagogic practice

  • MA in Mathematics and Pedagogy, The Education University of Hong Kong (2019–2020)

Interview question

  1. How can one assess parents’ developmental foci in a cross-cultural context? With developmental foci, we mean the domain (e.g. linguistic, social, physical, etc.) of a child’s development that is of particular importance to parents.
  2. Think about two communities (could be Germany and Namibia, but also other contexts you have experience with) and formulate hypotheses regarding potential differences in developmental foci.

The basic IRT assumptions

Bullets

When you click the Render button a document will be generated that includes:

  • Content authored with markdown
  • Output from executable code

This is part of the Quarto documentation.

R Code

When you click the Render button a presentation will be generated that includes both content and the output of embedded code. You can embed code like this:

1 + 1
[1] 2

This is part of the Quarto documentation.

You can also add text marked as code!

Equations

Adding Latex style equations is straightforward. Here is Euler’s identity:

\[ \begin{equation} e^{i\pi} + 1 = 0 \end{equation} \]

And here is Shepherd’s lemma:

\[ \begin{equation} \frac{P_1 - P_2}{Q_1 - Q_2} > \frac{P_1 - P_3}{Q_1 - Q_3} \end{equation} \]

Images

Adding images is easy, simply type ![Photo Description](path\to\image), et voilà!

Source: Link

Some concerns

Tabset example

Content here for tabset 1 :)

More content here, for tabset 2 :)

Incremental content

Hi!

Use . . . to separate content as an incremental slide!

You can add R code to plot data…

g <- starwars |>
  ggplot() +
  geom_point(aes(x = height, y = mass)) +
  theme_dime()

You can add R code to plot data…and focus on (a) specific line(s):

starwars <- starwars |>
  dplyr::mutate(name = ifelse(name %in% c("Jabba Desilijic Tiure", "Tarfful"),
                              name, ""))

g <- starwars |>
  ggplot() +
  geom_point(aes(x = height, y = mass, col = sex)) +
  ggrepel::geom_text_repel(aes(x = height,
                               y = mass,
                               label = name),
                           max.overlaps = 100) +
  labs(title = "Star Wars Example",
       caption = "Star Wars Example Dataset",
       col = "Sex") +
  theme_dime()

See the Quarto Documentation for more details.

Before showing the results :)

g

A DIME color palette

The theme also contains a DIME/World Bank color palette and a color generator to make graphs more uniform and easier to generate. dime_palette() yields a named vector with the HEX codes of the corresponding colors for an easy integration in {ggplot2} graphs.

# The default discrete DIME color palette
dime_palette(name = "DIME", 5, type = "discrete")

# A continuous palette based on the DIME palette
dime_palette(name = "DIME", 21, type = "continuous")

A few more penguin examples

Let’s create a few more plots using the great {palmerpenguins} dataset and illustrate Simpson’s Paradox. These examples are inspired by this great talk.

Creating interactive graphs with Observable JS

Another way of creating interactive visualizations within your presentations is to use Observable JS, a Java Script framework developed by the creators of D3.js. See the Quarto documentation for more details.

Penguin regression tables

\[ \text{Bill Depth}_{i} = \alpha + \beta \times \text{Bill Length}_{i} + \epsilon_{i} \]

(1)
(Intercept)20.885 ***
(0.844)   
bill_length_mm-0.085 ***
(0.019)   
N342        
R20.055    
logLik-707.776    
AIC1421.552    
*** p < 0.001; ** p < 0.01; * p < 0.05.

\[ \text{Bill Depth}_{i, k} = \alpha_{k} + \beta_{k} \times \text{Bill Length}_{k, i} + \epsilon_{i} \\ \text{where } k = \text{Gentoo} \]

(1)
(Intercept)5.251 ***
(1.055)   
bill_length_mm0.205 ***
(0.022)   
N123        
R20.414    
logLik-138.834    
AIC283.667    
*** p < 0.001; ** p < 0.01; * p < 0.05.

What about other tables?

knitr::kable()

tab <- starwars |>
  tidyr::drop_na(species) |>
  group_by(species) |>
  summarise(
    n = n(),
    mean_heigth = round(mean(height, na.rm = TRUE)),
    mean_mass = round(mean(mass, na.rm = TRUE))
  ) |>
  slice_max(order_by = n, n = 4)

knitr::kable(tab)
species n mean_heigth mean_mass
Human 35 178 81
Droid 6 131 70
Gungan 3 209 74
Kaminoan 2 221 88
Mirialan 2 168 53
Twi’lek 2 179 55
Wookiee 2 231 124
Zabrak 2 173 80

DT::datatable()

With the smaller class in the slide! Ex: ## slide name {.smaller}

gt::gt()

species n mean_heigth mean_mass
Human 35 178 81
Droid 6 131 70
Gungan 3 209 74
Kaminoan 2 221 88
Mirialan 2 168 53
Twi'lek 2 179 55
Wookiee 2 231 124
Zabrak 2 173 80

reactable::reactable()

Simulation and visualisation

Simulation Settings (N=200)

  • Sample & Scale:
    • Groups: Germany (g, \(n=100\)) | Namibia (n, \(n=100\)).
    • Scale: 30 items (10 per domain), 4-point Likert, RSM (acat) logic.
  • Latent Structure (Traits):
    • Domains: L (Linguistics), S (Social), P (Professional).
    • Consistency: \(\rho = 0.6\) for same traits across domains.
    • Conflicts (\(a\) vs \(r\)): \(L = -0.2\) | \(S = -0.5\) | \(P = -0.8\) (highest tension).
  • Group n (Namibia) Specifics:
    • Trait Shift: Autonomy (a) -0.5; Relatedness (r) +0.5.
    • Response Bias: Added systematic +0.6 “optimism bias”.
    • Group g (Germany) Specifics:
    • Trait Shift: Autonomy (a) +0.5; Relatedness (r) -0.5.
  • Item Distribution:
    • 5 positive coding (a) and 5 negative coding (r) items per domain.

Simulation via brms

ID comm Domain item resp dim_a dim_r
6 G L La5 1 1 0
96 G L La3 3 1 0
99 G L La1 1 1 0
137 N P Pa3 3 1 0
159 N S Sr3 3 0 1
160 N P Pa4 2 1 0
fit <- brm(
  formula = resp ~ 1 + comm + (0 + dim_a + dim_r | ID) + (1 | item),
  data = simdata,
  family = brmsfamily("acat", "logit"), 
  prior = c(
    prior(normal(0, 3), class = "b"), 
    prior(normal(0, 1), class = "sd"),
    prior(lkj(2), class = "cor")
  ),
  backend = "cmdstanr", chains = 4, iter = 2000, warmup = 1000, cores = 4,
  file = "models/fit_rsm"
)
 Family: acat 
  Links: mu = logit; disc = identity 
Formula: resp ~ 1 + comm + (0 + dim_a + dim_r | ID) + (1 | item) 
   Data: simdata (Number of observations: 6000) 
  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup draws = 4000

Multilevel Hyperparameters:
~ID (Number of levels: 200) 
                 Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sd(dim_a)            0.69      0.05     0.60     0.80 1.00     1426     2412
sd(dim_r)            0.68      0.05     0.58     0.79 1.00     1120     2257
cor(dim_a,dim_r)    -0.29      0.08    -0.43    -0.13 1.00      876     1712

~item (Number of levels: 30) 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sd(Intercept)     0.72      0.10     0.55     0.93 1.01      791     1646

Regression Coefficients:
             Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept[1]    -0.91      0.15    -1.20    -0.61 1.01      347      590
Intercept[2]     0.07      0.15    -0.22     0.35 1.01      318      453
Intercept[3]     1.11      0.15     0.81     1.39 1.01      322      425
commN            0.60      0.08     0.44     0.77 1.00     1137     1867

Further Distributional Parameters:
     Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
disc     1.00      0.00     1.00     1.00   NA       NA       NA

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).

Visualise the base model

Figure 1: Wright map. Results from the Bayesian 1PL RSM. The leftmost panel displays item difficulty estimates across the three domains (L, S, P). The two rightmost panels highlight the community-level trait differences.

Figure 2: Community Effects. Conditional effects of Community. The left plot shows the predicted mean response. The right plot displays category-wise probabilities (1–4), demonstrating how the +0.6 optimism bias in group \(N\) shifts responses toward higher categories.

Advance model specification

fit_sep <- brm(
 formula = resp ~ 1 + comm + (0 + Domain:dim_a + Domain:dim_r | ID) + (1 | item),
  data = simdata,
  family = brmsfamily("acat", "logit"), 
  prior = c(
    prior(normal(0, 1), class = "sd"),
    prior(lkj(2), class = "cor")
  ),
  chains = 4, iter = 2000, warmup = 1000, cores = 4, backend = "cmdstanr",
  file = "models/fit_sep_dim"
)
 Family: acat 
  Links: mu = logit; disc = identity 
Formula: resp ~ 1 + comm + (0 + Domain:dim_a + Domain:dim_r | ID) + (1 | item) 
   Data: simdata (Number of observations: 6000) 
  Draws: 4 chains, each with iter = 2000; warmup = 1000; thin = 1;
         total post-warmup draws = 4000

Multilevel Hyperparameters:
~ID (Number of levels: 200) 
                                 Estimate Est.Error l-95% CI u-95% CI Rhat
sd(DomainL:dim_a)                    0.86      0.07     0.72     1.02 1.00
sd(DomainP:dim_a)                    0.97      0.07     0.83     1.13 1.00
sd(DomainS:dim_a)                    0.97      0.08     0.83     1.13 1.00
sd(DomainL:dim_r)                    0.91      0.08     0.76     1.07 1.00
sd(DomainP:dim_r)                    1.08      0.08     0.92     1.25 1.00
sd(DomainS:dim_r)                    0.86      0.08     0.72     1.02 1.00
cor(DomainL:dim_a,DomainP:dim_a)     0.65      0.07     0.51     0.78 1.00
cor(DomainL:dim_a,DomainS:dim_a)     0.57      0.08     0.41     0.71 1.00
cor(DomainP:dim_a,DomainS:dim_a)     0.47      0.08     0.29     0.62 1.01
cor(DomainL:dim_a,DomainL:dim_r)    -0.21      0.09    -0.39    -0.03 1.00
cor(DomainP:dim_a,DomainL:dim_r)    -0.11      0.09    -0.29     0.08 1.01
cor(DomainS:dim_a,DomainL:dim_r)     0.06      0.10    -0.13     0.24 1.00
cor(DomainL:dim_a,DomainP:dim_r)    -0.11      0.10    -0.30     0.08 1.00
cor(DomainP:dim_a,DomainP:dim_r)    -0.61      0.07    -0.73    -0.46 1.00
cor(DomainS:dim_a,DomainP:dim_r)     0.03      0.09    -0.15     0.21 1.00
cor(DomainL:dim_r,DomainP:dim_r)     0.53      0.08     0.37     0.68 1.00
cor(DomainL:dim_a,DomainS:dim_r)    -0.10      0.10    -0.29     0.10 1.00
cor(DomainP:dim_a,DomainS:dim_r)    -0.10      0.10    -0.29     0.09 1.00
cor(DomainS:dim_a,DomainS:dim_r)    -0.47      0.08    -0.62    -0.31 1.00
cor(DomainL:dim_r,DomainS:dim_r)     0.62      0.08     0.46     0.75 1.00
cor(DomainP:dim_r,DomainS:dim_r)     0.35      0.09     0.17     0.52 1.00
                                 Bulk_ESS Tail_ESS
sd(DomainL:dim_a)                    1637     2807
sd(DomainP:dim_a)                    1513     2588
sd(DomainS:dim_a)                    1841     2533
sd(DomainL:dim_r)                    1992     2607
sd(DomainP:dim_r)                    1734     2899
sd(DomainS:dim_r)                    1626     2820
cor(DomainL:dim_a,DomainP:dim_a)      785     1539
cor(DomainL:dim_a,DomainS:dim_a)      898     1864
cor(DomainP:dim_a,DomainS:dim_a)      996     1846
cor(DomainL:dim_a,DomainL:dim_r)      749     1665
cor(DomainP:dim_a,DomainL:dim_r)      789     1749
cor(DomainS:dim_a,DomainL:dim_r)     1066     2013
cor(DomainL:dim_a,DomainP:dim_r)      796     1577
cor(DomainP:dim_a,DomainP:dim_r)     1353     2254
cor(DomainS:dim_a,DomainP:dim_r)     1541     2504
cor(DomainL:dim_r,DomainP:dim_r)     1857     3098
cor(DomainL:dim_a,DomainS:dim_r)      825     1572
cor(DomainP:dim_a,DomainS:dim_r)      951     1993
cor(DomainS:dim_a,DomainS:dim_r)     1166     2379
cor(DomainL:dim_r,DomainS:dim_r)     1996     2733
cor(DomainP:dim_r,DomainS:dim_r)     2076     2828

~item (Number of levels: 30) 
              Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
sd(Intercept)     0.83      0.12     0.63     1.11 1.00      641     1242

Regression Coefficients:
             Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
Intercept[1]    -1.13      0.17    -1.48    -0.81 1.01      331      682
Intercept[2]     0.06      0.16    -0.28     0.38 1.01      314      708
Intercept[3]     1.35      0.17     1.00     1.66 1.01      346      724
commN            0.70      0.09     0.52     0.87 1.00      989     1790

Further Distributional Parameters:
     Estimate Est.Error l-95% CI u-95% CI Rhat Bulk_ESS Tail_ESS
disc     1.00      0.00     1.00     1.00   NA       NA       NA

Draws were sampled using sample(hmc). For each parameter, Bulk_ESS
and Tail_ESS are effective sample size measures, and Rhat is the potential
scale reduction factor on split chains (at convergence, Rhat = 1).

Visualise advance model

Figure 3: Domain-specific latent correlations. Scatter plots illustrating the relationship between Autonomy (\(a\)) and Relatedness (\(r\)) across Linguistics (L), Social (S), and Professional (P) domains. Dashed lines represent the linear regressions of the recovered core conflicts, while point shapes distinguish between the German (\(G\)) and Namibian (\(N\)) communities.

Figure 4: Latent correlation matrix (\(\Phi\)) recovery. Heatmaps comparing the posterior mean estimates (left) against the target truth values (right) for the \(6 \times 6\) latent structure. The model effectively recovers the simulated correlations.

References